﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using produccion.clases;
using System.Windows;
using System.ComponentModel;
using System.Diagnostics;
using produccion.AccesoDatos;
using System.Windows.Input;
using produccion.forms;
using System.Data;

namespace produccion.vistamodelo
{
    class VMusuarios : ViewModelBase, IDataErrorInfo
    {

        #region campos
        private CLSMAEUSUP _usuario=new CLSMAEUSUP();
        private ProcesoProduccionRepositorio _rep=new ProcesoProduccionRepositorio(); 
        #endregion

        #region interfaces publicas
        
        //-------------------------------------------------
        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; base.OnPropertyChanged("strTituloVentana"); }
        }

        private VMbuscarGeneral _buscarUsuario;
        public VMbuscarGeneral buscarUsuario
        {
            get { return _buscarUsuario; }
            set { _buscarUsuario = value; base.OnPropertyChanged("buscarUsuario"); }
        }

        public string codUsuario 
        {
            get { return _usuario.CODUSU_USU; }
            set 
            { 
                _usuario.CODUSU_USU = value;
                consultarUsuario();
                base.OnPropertyChanged("codUsuario");
            }
        }

        public string nomUsuario
        {
            get { return _usuario.NOMUSU_USU; }
            set { _usuario.NOMUSU_USU = value; base.OnPropertyChanged("nomUsuario"); }
        }

        public string clave1 
        {
            get { return _usuario.PASUSU_USU; }
            set { _usuario.PASUSU_USU = value; base.OnPropertyChanged("clave1"); }
        }

        private string _clave2;
        public string clave2
        {
            get { return _clave2; }
            set { _clave2 = value; base.OnPropertyChanged("clave2"); }
        }

        public string strEstado 
        {
            get { return _usuario.ACTUSU_USU; }
            set { _usuario.ACTUSU_USU = value; base.OnPropertyChanged("strEstado"); }
        }

        public string strIndicedeGestion
        {
            get { return _usuario.USAINDGES_USU; }
            set { _usuario.USAINDGES_USU = value; base.OnPropertyChanged("strIndicedeGestion"); }
        }

        private List<CLSMAEUSUP> _lisusuarios = new List<CLSMAEUSUP>();
        public List<CLSMAEUSUP> lisusuarios
        {
            get { return _lisusuarios; }
            set { _lisusuarios = value; base.OnPropertyChanged("lisusuarios"); }
        }

        private CLSMAEUSUP _selusuario = new CLSMAEUSUP();
        public CLSMAEUSUP selusuario
        {
            get { return _selusuario; }
            set
            {
                _selusuario = value;
                if (_selusuario != null && _selusuario != null)
                {
                    codUsuario = _selusuario.CODUSU_USU;
                    consultarUsuario();
                }
                base.OnPropertyChanged("selusuario");
            }
        }

        RelayCommand _cmdGuardar;
        public ICommand cmdGuardar
        {
            get
            {
                if (_cmdGuardar == null)
                {
                    _cmdGuardar = new RelayCommand(r => GuardarUsuario());
                }
                return _cmdGuardar;
            }
        }
        
        MDOgeneral.mensaje _msn = new MDOgeneral.mensaje();
        public MDOgeneral.mensaje msn {
            get { return _msn; }
            set { _msn = value;
            base.OnPropertyChanged("msn");
            }
        }


        RelayCommand _cmdBuscar;
        public ICommand cmdBuscar
        {
            get
            {
                if (_cmdBuscar == null)
                {
                    _cmdBuscar = new RelayCommand(x=>BuscarUsuario());
                }
                return _cmdBuscar;
            }
        }

        RelayCommand _cmdSalir;
        public ICommand cmdSalir
        {
            get
            {
                if (_cmdSalir == null)
                {
                    _cmdSalir = new RelayCommand(Salir);
                }
                return _cmdSalir;
            }
        }

#endregion

        #region constructor
        public VMusuarios()
        {
            try
            {

                lisusuarios = _usuario.listarUsuarios();       
                cargar_usuarios();
                if (MDOgeneral.conexion == null || MDOgeneral.conexion.State == ConnectionState.Closed)
                {
                    MDOgeneral.conectar();
                }
                strTituloVentana = "Usuarios - Usuario: " + MDOgeneral.usuario + " - [FRMusuarios]";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }

        }
        #endregion

        #region metodos

        //---------------------------------------------
        private void cargar_usuarios()
        {
            try
            {
                List<CLSMAEUSUP> lisusuarios = new CLSMAEUSUP().listarUsuario();
                _buscarUsuario = new VMbuscarGeneral((from usu in lisusuarios select new 
                    VMlistaGenerica { strColumna1 = usu.CODUSU_USU, strColumna2 = usu.NOMUSU_USU }).ToList());
                buscarUsuario.PropertyChanged += onBuscarUsuarioPropertyChanged;
                buscarUsuario.gridBuscar.columna1.strNombre = "Código";
                buscarUsuario.gridBuscar.columna2.strNombre = "Nombre";
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void onBuscarUsuarioPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            try
            {
                if (e.PropertyName == "IsOpen")
                {
                    if (!buscarUsuario.IsOpen)
                        if (buscarUsuario.gridBuscar.selLista != null)
                        {
                            codUsuario = buscarUsuario.gridBuscar.selLista.strColumna1;
                        }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        RelayCommand _cmdBuscarUsuario;
        public ICommand cmdBuscarUsuario
        {
            get
            {
                if (_cmdBuscarUsuario == null)
                {
                    _cmdBuscarUsuario = new RelayCommand(r => buscar_usuario());
                }
                return _cmdBuscarUsuario;
            }
        }

        private void buscar_usuario()
        {
            try
            {
                buscarUsuario.IsOpen = true;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void consultarUsuario()
        {
            try
            {

                _usuario.consultar();
                clave2 = _usuario.PASUSU_USU;
                base.OnPropertyChanged("codUsuario");
                base.OnPropertyChanged("nomUsuario");
                base.OnPropertyChanged("clave1");
                base.OnPropertyChanged("clave2");
                base.OnPropertyChanged("strEstado");
                base.OnPropertyChanged("strIndicedeGestion");

            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        
        void GuardarUsuario()
        {
            try
            {

                if (_rep.GuardarUsuario(_usuario))
                {
                    lisusuarios = _usuario.listarUsuarios(); 
                    msn.texto = "El usuario ha sido guardado correctamente.";
                    msn.tipo = true;
                }
                else
                {

                    msn.texto = "El usuario no puede ser guardado";
                    msn.tipo = false;
                }

            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void BuscarUsuario() 
        {
            try {

                if (String.IsNullOrEmpty(codUsuario))
                    codUsuario = "";

                FRMbuscar w = new FRMbuscar(_usuario, "buscar", "Nombre", "NOMUSU_USU","Codigo");
                w.ShowDialog();
                if (!String.IsNullOrEmpty(w.retorno)) {
                    if (!codUsuario.Equals(w.retorno))
                    {
                        codUsuario = w.retorno;
                    }
                } 
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void Salir(object frm)
        {
            try
            {
                ((Window)frm).Close();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        #endregion

        #region IDataErrorInfo Members

        string IDataErrorInfo.Error { get { return null; } }

        string IDataErrorInfo.this[string propertyName]
        {
            get { return this.GetValidationError(propertyName); }
        }

        #endregion

        #region Validation

        /// <summary>
        /// Returns true if this object has no validation errors.
        /// </summary>
        public bool IsValid
        {
            get
            {
                foreach (string property in ValidatedProperties)
                    if (GetValidationError(property) != null)
                        return false;

                return true;
            }
        }

        static readonly string[] ValidatedProperties = 
        { 
            "codUsuario",
            "nomUsuario",
            "clave1",
            "clave2"
        };

        string GetValidationError(string propertyName)
        {
            if (Array.IndexOf(ValidatedProperties, propertyName) < 0)
                return null;

            string error = null;

            switch (propertyName)
            {

                case "codUsuario":
                    error = this.ValidatecodUsuario();
                    break;
                case "nomUsuario":
                    error = this.ValidatenomUsuario();
                    break;
                case "clave1":
                    error = this.Validateclave1();
                    break;
                case "clave2":
                    error = this.Validateclave2();
                    break;

                default:
                    Debug.Fail("Unexpected property being validated on Customer: " + propertyName);
                    break;
            }

            return error;
        }

        string Validateclave1()
        {

            if (clave1 == null) { return "La clave no puede estar vacia."; }

            if (clave1 != null)
            {
                if (clave1.Length != 6) { return "La clave debe tener 6 caracteres."; }
                if (clave1 != null && clave2 != null)
                {
                    if (clave2.Length == 6)
                    {
                        if (clave1 != clave2) { return "La claves ingresadas no coinciden."; }
                    }
                }
            }
                       
            return null;
        }

        string Validateclave2()
        {
            if (clave2 == null) { return "La clave 2 no puede estar vacia."; }

            if (clave2 != null)
            {
                if (clave2.Length != 6) { return "La clave debe tener 6 caracteres."; }
                if (clave1 != null && clave2 != null)
                {
                    if (clave1.Length == 6)
                    {
                        if (clave2 != clave1) { return "La claves ingresadas no coinciden."; }
                    }
                }
                //base.OnPropertyChanged("clave2");
            }
            return null;
        }


        string ValidatecodUsuario()
        {
            if (codUsuario == null) { return "El usuario no puede estar vacio"; }
            if (codUsuario != null)
            {
                if (codUsuario.Length != 6) { return "El usuario debe tener 6 caracteres."; }
            }
            return null;
        }

        string ValidatenomUsuario()
        {

            if (nomUsuario == null) { return "El nombre del usuario no puede estar vacio"; }
            if (nomUsuario != null)
            {
                if (nomUsuario.Length > 40) { return "El nombre de usuario no puede tener mas de 40 caracteres."; }
                if (nomUsuario.Length < 5) { return "El nombre de usuario es incorrecto."; }
            }
           
            return null;
        }


        #endregion

    }
}
